
#include "FrontCoder.h"

#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

/* Devuelve la cantidad de caracteres iguales desde el inicio del string inicial */
int obtener_repetidos (const char* inicial, char* final) {
	if (final == NULL) return 0;
	
	size_t tam_i = strlen (inicial);
	size_t tam_f = strlen (final);
	
	int i = 0;
	bool ok = true;
	while (i < tam_i && i < tam_f && ok) {
		if (inicial[i] == final[i]) i++;
		else ok = false;
	}
	
	return i;
}

/* Devuelve la cantidad de caracteres distintos desde que dejaron de ser iguales */
int obtener_distintos (const char* inicial, char* final) {
	return (strlen (inicial) - obtener_repetidos (inicial, final));
}

/* Genera un string que es la diferencia entre inicial y final */
char* obtener_truncado (const char* inicial, char* final) {
	int i,k,j;
	size_t tam_i = strlen (inicial);
	//size_t tam_f = strlen (final);
	size_t repetidos = obtener_repetidos (inicial, final);
	
	j = tam_i - repetidos;
		
	char* truncado = malloc ( (j * sizeof (char) ) + 1);
	if (!truncado) return NULL;
	
	if (final == NULL) {
		strcpy (truncado, inicial);
		return truncado;
	}
	
	k = 0;
	for (i = obtener_repetidos (inicial, final); i < j + repetidos; i++) {
		truncado[k] = inicial[i];
		k++;
	}
	truncado[k] = '\0';
	
	return truncado;
}

/* Devuelve la cadena entera dado una cadena anterior y una truncada. */
char* obtener_cadena_entera (int distintos, int repetidos, char* cadenaAnterior, char* truncado) {
	char* final = malloc ( (distintos + repetidos) * sizeof (char) + 1);
	memset (final, 0, (distintos + repetidos) + 1);
	
	if (!cadenaAnterior) {
		strcpy (final, truncado);
		return final;
	}
	
	strncpy (final, cadenaAnterior, repetidos);
	strcat (final, truncado);
	return final;
}

